0.1 Load all of the throw data

#load omnibus dataframe
omnibus_df <- read_delim("../data/processed/omnibus/omnibus_raw.csv", 
                            delim = ",", 
                            col_types = cols(.default = col_double(), 
                                             type = col_factor(),
                                             ppid = col_factor(),
                                             exp_label = col_factor(),
                                             experiment = col_factor(),
                                             hand = col_factor(),
                                             camera_tilt = col_factor(),
                                             surface_tilt = col_factor(),
                                             target = col_factor(),
                                             test_type = col_factor(),
                                             prior_anim = col_factor(),
                                             baseline_block = col_factor(),
                                             task_type = col_factor(),
                                             surface = col_factor(),
                                             anim_type = col_factor()))

original_exps <- c("rot15_cued_tilt", "rot15_uncued", "tilt_uncued_rot", 
                   "tilt_uncued_norot", "tilt_cued_rot", "tilt_cued_norot")

1 Visualizing data (univariate)

test_ppt <- 3

test_df <- omnibus_df %>% filter(ppid == test_ppt)


trial <- 250
trial_df <- filter(test_df, trial_num == trial)

x <- trial_df$flick_velocity_x
y <- trial_df$flick_velocity_y
z <- trial_df$flick_velocity_z

x2 <- trial_df$flick_direction_x
y2 <- trial_df$flick_direction_y
z2 <- trial_df$flick_direction_z

# plot both
plot_ly(x = c(0, x), y = c(0, y), z = c(0, z), type = "scatter3d", mode = "lines") %>%
  add_trace(x = c(0, x2), y = c(0, y2), z = c(0, z2), type = "scatter3d", mode = "lines") %>%
  layout(scene = list(xaxis = list(title = "x"),
                      yaxis = list(title = "y"),
                      zaxis = list(title = "z")))

# note: this is a rotated trial
# plot distribution of error_size
p <- ggplot(omnibus_df, aes(x = error_size)) +
  geom_histogram(binwidth = .5) +
  theme_minimal() +
  theme(text = element_text(size = 11)) +
  labs(x = "Error Size (cm)", y = "Count")

p

2 Group

2.1 All throws

# try just animate_surface exp
animate_surface_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "animate_surface") %>%
  group_by(prior_anim, block_num, trial_num_in_block, trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )
`summarise()` has grouped output by 'prior_anim', 'block_num', 'trial_num_in_block'. You can override using the `.groups` argument.
data <- animate_surface_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation,
      ymin = mean_deviation - ci_deviation,
      ymax = mean_deviation + ci_deviation
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# repeat for prior_anim == "half", "full" and "wait"
for (unique_prior_anim in unique(data$prior_anim)) {
  # get the data for this block
  to_plot_data <- filter(data, prior_anim == unique_prior_anim)
  # loop through the unique blocks in to_plot_data
  for (block in unique(to_plot_data$block_num)) {
    # get the data for this block
    block_data <- filter(to_plot_data, block_num == block)
    # add the data, use the pallete_list to get the colour
    p <- p + geom_ribbon(
      data = block_data,
      aes(fill = prior_anim),
      colour = NA, alpha = 0.3
      ) + geom_line(
      data = block_data,
      aes(colour = prior_anim))
    
  }
}


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

ggplotly(p)
# p
# rest of the exps
original_exps_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "original_exps") %>%
  group_by(experiment, trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )

data <- original_exps_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation, colour = experiment
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# add confidence intervals
p <- p + geom_ribbon(
  aes(
    ymin = mean_deviation - ci_deviation,
    ymax = mean_deviation + ci_deviation,
    fill = experiment
  ), colour = NA, alpha = 0.3
  )


# add data
p <- p + geom_line()


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

ggplotly(p)

# p
ggplotly(plot_original_learning_curve(omnibus_path))

visible vs non-visible tilt doesn’t affect the 15-degree rotation condition. But affects all other conditions. So 15-degree rotation

ggplotly(plot_original_rebound(omnibus_path))

Plot all the trials and see if there are group effects.

all_throw_summary <- omnibus_df %>%
  group_by(experiment, trial_num) %>%
  summarise(mean = mean(error_size, na.rm = TRUE),
            sd = sd(error_size, na.rm = TRUE), 
            ci = vector_confint(error_size),
            n = n(), .groups = "drop")
p <- omnibus_df %>%
  ggplot(aes(x = trial_num, y = error_size)) +
  # geom_point(alpha = 0.04, aes(colour = experiment)) + 
  geom_ribbon(data = all_throw_summary, 
                 aes(y = mean, ymin = mean-ci,
                     ymax = mean+ci, fill = experiment), 
              alpha = 0.3) +
  geom_line(data = all_throw_summary, 
            aes(y = mean, colour = experiment)) +
  theme_minimal() +
  # scale_x_continuous(limits = c(205, 374)) +
  NULL

# ggplotly(p)
p
# save plot
# ggsave(p, height = 9, width = 16, device = "svg", filename = "data/figs/all_throws.svg")

2.2 Success manifolds

2.2.1 Without any tilts

# ggplotly(plot_success_manifold_no_tilt())
plot_success_manifold_no_tilt()

2.2.2 With tilt present

ggplotly(plot_success_manifold_tilt())
LS0tDQp0aXRsZTogIkJpbGxpYXJkcyBhbmQgVGlsdHMgQW5hbHlzaXMgTm90ZWJvb2siDQphdXRob3I6ICJTaGFuYWF0aGFuYW4gTW9kY2hhbGluZ2FtIg0KZGF0ZTogIkRlYyAwNiwgMjAyMSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybShsaXN0ID0gbHMoKSkgICAgICAjIGNsZWFuIGVudmlyb25tZW50DQoNCnNvdXJjZSgiLi4vc3JjL2hlbHBlcl9mdW5jcy5SIikNCnNvdXJjZSgiLi4vc2NyaXB0cy9maWd1cmVfZnVuY3MuUiIpIA0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnYmVlc3dhcm0pDQpsaWJyYXJ5KGV6KSAjZm9yIEFOT1ZBcw0KbGlicmFyeShlZmZlY3RzaXplKSAjIGZvciBldGEtc3F1YXJlZA0KbGlicmFyeShwbG90bHkpDQoNCiMgdmFycw0Kb21uaWJ1c19wYXRoIDwtICIuLi9kYXRhL3Byb2Nlc3NlZC9vbW5pYnVzL29tbmlidXNfcmF3LmNzdiINCg0KIyBjb252ZXJ0IHRoZSBhYm92ZSBpbnRvIGEgbGlzdA0KcGFsbGV0ZV9saXN0IDwtIGMoInJvdF9jIiA9ICIjZDQwMDAwIiwNCiAgICAgICAgICAgICAicm90X25jIiA9ICIjZjk5ODJjIiwNCiAgICAgICAgICAgICAidGlsdF9jIiA9ICIjMDc1MDliIiwNCiAgICAgICAgICAgICAidGlsdF9uYyIgPSAiIzVmYjY5NiIsDQogICAgICAgICAgICAgInJvdF8xNV9jIiA9ICIjNzQwMDAwIiwNCiAgICAgICAgICAgICAicm90XzE1X25jIiA9ICIjOTk5ODJjIiwNCiAgICAgICAgICAgICAibm9uZSIgPSAiI2Q0MDAwMCIsDQogICAgICAgICAgICAgImhhbGYiID0gIiM1ZmI2OTYiLA0KICAgICAgICAgICAgICJmdWxsIiA9ICIjMDc1MDliIiwNCiAgICAgICAgICAgICAid2FpdCIgPSAiIzk5OTgyYyIpDQoNCmBgYA0KDQoNCg0KIyMgTG9hZCBhbGwgb2YgdGhlIHRocm93IGRhdGENCg0KDQoNCmBgYHtyfQ0KI2xvYWQgb21uaWJ1cyBkYXRhZnJhbWUNCm9tbmlidXNfZGYgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9wcm9jZXNzZWQvb21uaWJ1cy9vbW5pYnVzX3Jhdy5jc3YiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICIsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9IGNvbF9kb3VibGUoKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBpZCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9sYWJlbCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX3RpbHQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX3RpbHQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3R5cGUgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcl9hbmltID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVfYmxvY2sgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3R5cGUgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbV90eXBlID0gY29sX2ZhY3RvcigpKSkNCg0Kb3JpZ2luYWxfZXhwcyA8LSBjKCJyb3QxNV9jdWVkX3RpbHQiLCAicm90MTVfdW5jdWVkIiwgInRpbHRfdW5jdWVkX3JvdCIsIA0KICAgICAgICAgICAgICAgICAgICJ0aWx0X3VuY3VlZF9ub3JvdCIsICJ0aWx0X2N1ZWRfcm90IiwgInRpbHRfY3VlZF9ub3JvdCIpDQpgYGANCg0KIyBWaXN1YWxpemluZyBkYXRhICh1bml2YXJpYXRlKQ0KDQpgYGB7cn0NCnRlc3RfcHB0IDwtIDMNCg0KdGVzdF9kZiA8LSBvbW5pYnVzX2RmICU+JSBmaWx0ZXIocHBpZCA9PSB0ZXN0X3BwdCkNCg0KDQp0cmlhbCA8LSAyNTANCnRyaWFsX2RmIDwtIGZpbHRlcih0ZXN0X2RmLCB0cmlhbF9udW0gPT0gdHJpYWwpDQoNCnggPC0gdHJpYWxfZGYkZmxpY2tfdmVsb2NpdHlfeA0KeSA8LSB0cmlhbF9kZiRmbGlja192ZWxvY2l0eV95DQp6IDwtIHRyaWFsX2RmJGZsaWNrX3ZlbG9jaXR5X3oNCg0KeDIgPC0gdHJpYWxfZGYkZmxpY2tfZGlyZWN0aW9uX3gNCnkyIDwtIHRyaWFsX2RmJGZsaWNrX2RpcmVjdGlvbl95DQp6MiA8LSB0cmlhbF9kZiRmbGlja19kaXJlY3Rpb25feg0KDQojIHBsb3QgYm90aA0KcGxvdF9seSh4ID0gYygwLCB4KSwgeSA9IGMoMCwgeSksIHogPSBjKDAsIHopLCB0eXBlID0gInNjYXR0ZXIzZCIsIG1vZGUgPSAibGluZXMiKSAlPiUNCiAgYWRkX3RyYWNlKHggPSBjKDAsIHgyKSwgeSA9IGMoMCwgeTIpLCB6ID0gYygwLCB6MiksIHR5cGUgPSAic2NhdHRlcjNkIiwgbW9kZSA9ICJsaW5lcyIpICU+JQ0KICBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9ICJ4IiksDQogICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gInkiKSwNCiAgICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAieiIpKSkNCg0KIyBub3RlOiB0aGlzIGlzIGEgcm90YXRlZCB0cmlhbA0KYGBgDQoNCg0KYGBge3J9DQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyBwbG90IGRpc3RyaWJ1dGlvbiBvZiBlcnJvcl9zaXplDQpwIDwtIGdncGxvdChvbW5pYnVzX2RmLCBhZXMoeCA9IGVycm9yX3NpemUpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gLjUpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArDQogIGxhYnMoeCA9ICJFcnJvciBTaXplIChjbSkiLCB5ID0gIkNvdW50IikNCg0KcA0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KYGBge3J9DQoNCg0KDQpgYGANCg0KIyBHcm91cCANCg0KIyMgQWxsIHRocm93cw0KDQpgYGB7cn0NCiMgdHJ5IGp1c3QgYW5pbWF0ZV9zdXJmYWNlIGV4cA0KYW5pbWF0ZV9zdXJmYWNlX3RyaWFsX3N1bW1hcnlfZGYgPC0gb21uaWJ1c19kZiAlPiUNCiAgZmlsdGVyKGV4cF9sYWJlbCA9PSAiYW5pbWF0ZV9zdXJmYWNlIikgJT4lDQogIGdyb3VwX2J5KHByaW9yX2FuaW0sIGJsb2NrX251bSwgdHJpYWxfbnVtX2luX2Jsb2NrLCB0cmlhbF9udW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9kZXZpYXRpb24gPSBtZWFuKHRocm93X2RldmlhdGlvbiksDQogICAgY2lfZGV2aWF0aW9uID0gdmVjdG9yX2NvbmZpbnQodGhyb3dfZGV2aWF0aW9uKQ0KICApDQoNCmRhdGEgPC0gYW5pbWF0ZV9zdXJmYWNlX3RyaWFsX3N1bW1hcnlfZGYNCg0KIyBzZXQgdXAgcGxvdA0KcCA8LSBkYXRhICU+JQ0KICBnZ3Bsb3QoDQogICAgYWVzKA0KICAgICAgeCA9IHRyaWFsX251bSwgeSA9IG1lYW5fZGV2aWF0aW9uLA0KICAgICAgeW1pbiA9IG1lYW5fZGV2aWF0aW9uIC0gY2lfZGV2aWF0aW9uLA0KICAgICAgeW1heCA9IG1lYW5fZGV2aWF0aW9uICsgY2lfZGV2aWF0aW9uDQogICAgKQ0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoDQogICAgeCA9ICJUcmlhbCBOdW1iZXIiLA0KICAgIHkgPSAiVGhyb3cgQW5nbGUgKMKwKSINCiAgKQ0KDQojIGFkZCBob3Jpem9udGFsIGxpbmVzDQpwIDwtIHAgKw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSBjKDAsIC0zMCksIGxpbmV3aWR0aCA9IDAuNCwNCiAgICBjb2xvdXIgPSAiI0NDQ0NDQyIsIGxpbmV0eXBlID0gInNvbGlkIg0KICApICsNCiAgZ2VvbV9obGluZSgNCiAgICB5aW50ZXJjZXB0ID0gYygtMTUpLCBsaW5ld2lkdGggPSAwLjQsDQogICAgY29sb3VyID0gIiNDQ0NDQ0MiLCBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICkNCg0KIyBwIDwtIHAgKw0KIyAgIHNjYWxlX3lfY29udGludW91cygNCiMgICAgIGxpbWl0cyA9IGMoLTEwLCAzNSksDQojICAgICBicmVha3MgPSBjKDAsIDE1LCAzMCksDQojICAgICBsYWJlbHMgPSBjKDAsIDE1LCAzMCkNCiMgICApICsNCiMgICBzY2FsZV94X2NvbnRpbnVvdXMoDQojICAgICBsaW1pdHMgPSBjKDAsIDE4MCksDQojICAgICBicmVha3MgPSBjKDAsIDYwLCAxMjAsIDE4MCksDQojICAgICBsYWJlbHMgPSBjKDAsIDYwLCAxMjAsIDE4MCkNCiMgICApDQoNCiMgc2V0IGZvbnQgc2l6ZSB0byAxMQ0KcCA8LSBwICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KDQojIHJlcGVhdCBmb3IgcHJpb3JfYW5pbSA9PSAiaGFsZiIsICJmdWxsIiBhbmQgIndhaXQiDQpmb3IgKHVuaXF1ZV9wcmlvcl9hbmltIGluIHVuaXF1ZShkYXRhJHByaW9yX2FuaW0pKSB7DQogICMgZ2V0IHRoZSBkYXRhIGZvciB0aGlzIGJsb2NrDQogIHRvX3Bsb3RfZGF0YSA8LSBmaWx0ZXIoZGF0YSwgcHJpb3JfYW5pbSA9PSB1bmlxdWVfcHJpb3JfYW5pbSkNCiAgIyBsb29wIHRocm91Z2ggdGhlIHVuaXF1ZSBibG9ja3MgaW4gdG9fcGxvdF9kYXRhDQogIGZvciAoYmxvY2sgaW4gdW5pcXVlKHRvX3Bsb3RfZGF0YSRibG9ja19udW0pKSB7DQogICAgIyBnZXQgdGhlIGRhdGEgZm9yIHRoaXMgYmxvY2sNCiAgICBibG9ja19kYXRhIDwtIGZpbHRlcih0b19wbG90X2RhdGEsIGJsb2NrX251bSA9PSBibG9jaykNCiAgICAjIGFkZCB0aGUgZGF0YSwgdXNlIHRoZSBwYWxsZXRlX2xpc3QgdG8gZ2V0IHRoZSBjb2xvdXINCiAgICBwIDwtIHAgKyBnZW9tX3JpYmJvbigNCiAgICAgIGRhdGEgPSBibG9ja19kYXRhLA0KICAgICAgYWVzKGZpbGwgPSBwcmlvcl9hbmltKSwNCiAgICAgIGNvbG91ciA9IE5BLCBhbHBoYSA9IDAuMw0KICAgICAgKSArIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSBibG9ja19kYXRhLA0KICAgICAgYWVzKGNvbG91ciA9IHByaW9yX2FuaW0pKQ0KICAgIA0KICB9DQp9DQoNCg0KIyAjIHNhdmUNCiMgaWYgKHNhdmVfcGxvdHMpIHsNCiMgICBnZ3NhdmUoDQojICAgcCwNCiMgICBmaWxlbmFtZSA9ICIuLi9wbG90cy9wYXBlcl9maWdzL3NyXzMwX3RyYWluaW5nLnBkZiIsIGRldmljZSA9ICJwZGYiLA0KIyAgIGhlaWdodCA9IDQsIHdpZHRoID0gNg0KIyAgICkNCiMgICB9DQoNCmdncGxvdGx5KHApDQojIHANCmBgYA0KDQoNCg0KYGBge3J9DQojIHJlc3Qgb2YgdGhlIGV4cHMNCm9yaWdpbmFsX2V4cHNfdHJpYWxfc3VtbWFyeV9kZiA8LSBvbW5pYnVzX2RmICU+JQ0KICBmaWx0ZXIoZXhwX2xhYmVsID09ICJvcmlnaW5hbF9leHBzIikgJT4lDQogIGdyb3VwX2J5KGV4cGVyaW1lbnQsIHRyaWFsX251bSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX2RldmlhdGlvbiA9IG1lYW4odGhyb3dfZGV2aWF0aW9uKSwNCiAgICBjaV9kZXZpYXRpb24gPSB2ZWN0b3JfY29uZmludCh0aHJvd19kZXZpYXRpb24pDQogICkNCg0KZGF0YSA8LSBvcmlnaW5hbF9leHBzX3RyaWFsX3N1bW1hcnlfZGYNCg0KIyBzZXQgdXAgcGxvdA0KcCA8LSBkYXRhICU+JQ0KICBnZ3Bsb3QoDQogICAgYWVzKA0KICAgICAgeCA9IHRyaWFsX251bSwgeSA9IG1lYW5fZGV2aWF0aW9uLCBjb2xvdXIgPSBleHBlcmltZW50DQogICAgKQ0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoDQogICAgeCA9ICJUcmlhbCBOdW1iZXIiLA0KICAgIHkgPSAiVGhyb3cgQW5nbGUgKMKwKSINCiAgKQ0KDQojIGFkZCBob3Jpem9udGFsIGxpbmVzDQpwIDwtIHAgKw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSBjKDAsIC0zMCksIGxpbmV3aWR0aCA9IDAuNCwNCiAgICBjb2xvdXIgPSAiI0NDQ0NDQyIsIGxpbmV0eXBlID0gInNvbGlkIg0KICApICsNCiAgZ2VvbV9obGluZSgNCiAgICB5aW50ZXJjZXB0ID0gYygtMTUpLCBsaW5ld2lkdGggPSAwLjQsDQogICAgY29sb3VyID0gIiNDQ0NDQ0MiLCBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICkNCg0KIyBwIDwtIHAgKw0KIyAgIHNjYWxlX3lfY29udGludW91cygNCiMgICAgIGxpbWl0cyA9IGMoLTEwLCAzNSksDQojICAgICBicmVha3MgPSBjKDAsIDE1LCAzMCksDQojICAgICBsYWJlbHMgPSBjKDAsIDE1LCAzMCkNCiMgICApICsNCiMgICBzY2FsZV94X2NvbnRpbnVvdXMoDQojICAgICBsaW1pdHMgPSBjKDAsIDE4MCksDQojICAgICBicmVha3MgPSBjKDAsIDYwLCAxMjAsIDE4MCksDQojICAgICBsYWJlbHMgPSBjKDAsIDYwLCAxMjAsIDE4MCkNCiMgICApDQoNCiMgc2V0IGZvbnQgc2l6ZSB0byAxMQ0KcCA8LSBwICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KDQojIGFkZCBjb25maWRlbmNlIGludGVydmFscw0KcCA8LSBwICsgZ2VvbV9yaWJib24oDQogIGFlcygNCiAgICB5bWluID0gbWVhbl9kZXZpYXRpb24gLSBjaV9kZXZpYXRpb24sDQogICAgeW1heCA9IG1lYW5fZGV2aWF0aW9uICsgY2lfZGV2aWF0aW9uLA0KICAgIGZpbGwgPSBleHBlcmltZW50DQogICksIGNvbG91ciA9IE5BLCBhbHBoYSA9IDAuMw0KICApDQoNCg0KIyBhZGQgZGF0YQ0KcCA8LSBwICsgZ2VvbV9saW5lKCkNCg0KDQojICMgc2F2ZQ0KIyBpZiAoc2F2ZV9wbG90cykgew0KIyAgIGdnc2F2ZSgNCiMgICBwLA0KIyAgIGZpbGVuYW1lID0gIi4uL3Bsb3RzL3BhcGVyX2ZpZ3Mvc3JfMzBfdHJhaW5pbmcucGRmIiwgZGV2aWNlID0gInBkZiIsDQojICAgaGVpZ2h0ID0gNCwgd2lkdGggPSA2DQojICAgKQ0KIyAgIH0NCg0KZ2dwbG90bHkocCkNCg0KIyBwDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3RseShwbG90X29yaWdpbmFsX2xlYXJuaW5nX2N1cnZlKG9tbmlidXNfcGF0aCkpDQpgYGANCg0KdmlzaWJsZSB2cyBub24tdmlzaWJsZSB0aWx0IGRvZXNuJ3QgYWZmZWN0IHRoZSAxNS1kZWdyZWUgcm90YXRpb24gY29uZGl0aW9uLiBCdXQgYWZmZWN0cyBhbGwgb3RoZXIgY29uZGl0aW9ucy4gU28gMTUtZGVncmVlIHJvdGF0aW9uDQoNCmBgYHtyfQ0KZ2dwbG90bHkocGxvdF9vcmlnaW5hbF9yZWJvdW5kKG9tbmlidXNfcGF0aCkpDQpgYGANCg0KDQpQbG90IGFsbCB0aGUgdHJpYWxzIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGdyb3VwIGVmZmVjdHMuDQpgYGB7cn0NCmFsbF90aHJvd19zdW1tYXJ5IDwtIG9tbmlidXNfZGYgJT4lDQogIGdyb3VwX2J5KGV4cGVyaW1lbnQsIHRyaWFsX251bSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihlcnJvcl9zaXplLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgc2QgPSBzZChlcnJvcl9zaXplLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNpID0gdmVjdG9yX2NvbmZpbnQoZXJyb3Jfc2l6ZSksDQogICAgICAgICAgICBuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OS41fQ0KcCA8LSBvbW5pYnVzX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0cmlhbF9udW0sIHkgPSBlcnJvcl9zaXplKSkgKw0KICAjIGdlb21fcG9pbnQoYWxwaGEgPSAwLjA0LCBhZXMoY29sb3VyID0gZXhwZXJpbWVudCkpICsgDQogIGdlb21fcmliYm9uKGRhdGEgPSBhbGxfdGhyb3dfc3VtbWFyeSwgDQogICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4tY2ksDQogICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbitjaSwgZmlsbCA9IGV4cGVyaW1lbnQpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjMpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBhbGxfdGhyb3dfc3VtbWFyeSwgDQogICAgICAgICAgICBhZXMoeSA9IG1lYW4sIGNvbG91ciA9IGV4cGVyaW1lbnQpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICMgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjA1LCAzNzQpKSArDQogIE5VTEwNCg0KIyBnZ3Bsb3RseShwKQ0KcA0KIyBzYXZlIHBsb3QNCiMgZ2dzYXZlKHAsIGhlaWdodCA9IDksIHdpZHRoID0gMTYsIGRldmljZSA9ICJzdmciLCBmaWxlbmFtZSA9ICJkYXRhL2ZpZ3MvYWxsX3Rocm93cy5zdmciKQ0KYGBgDQoNCiMjIFN1Y2Nlc3MgbWFuaWZvbGRzDQojIyMgV2l0aG91dCBhbnkgdGlsdHMNCmBgYHtyLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0yMH0NCiMgZ2dwbG90bHkocGxvdF9zdWNjZXNzX21hbmlmb2xkX25vX3RpbHQoKSkNCnBsb3Rfc3VjY2Vzc19tYW5pZm9sZF9ub190aWx0KCkNCmBgYA0KDQojIyMgV2l0aCB0aWx0IHByZXNlbnQNCmBgYHtyLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD0yMH0NCmdncGxvdGx5KHBsb3Rfc3VjY2Vzc19tYW5pZm9sZF90aWx0KCkpDQpgYGANCg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCk5VTEwNCmBgYA0KDQo=